#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
@Time 2024-02-01 14:39
@Author: wanbo
@Despcription: 列表的使用及注意事项
'''

#----------------------------------------------------------
# 列表的定义及增删改
#----------------------------------------------------------
if(0):
    # 列表中可以包含不同的数据类型
    # 可以使用print直接打印列表
    my_list = [1, 2, 3, 4, 5, "hell", "l", "o"]
    print(my_list)  # [1, 2, 3, 4, 5, 'hell', 'l', 'o']

    # 列表是mutable对象， 可以修改
    # TODO: 不可以向列表范围外的键赋值， 必须用list.append()方法
    my_list[5] = "haha"
    print(my_list)  # [1, 2, 3, 4, 5, 'haha', 'l', 'o']

    # 列表可以嵌套
    my_list2 = [my_list, "2", "3"]
    print(my_list2) # [[1, 2, 3, 4, 5, 'haha', 'l', 'o'], '2', '3']

    # 可以将列表切片后赋值， 但必须赋值可修改的对象
    # 直接赋值空列表， 相当于批量删除列表中的内容
    my_list[2:5] = []
    print("my_list:{}, len:{}".format(my_list, len(my_list)))

    # 求列表长度
    print("my_list length:{}".format(len(my_list)))
    
#----------------------------------------------------------
# 遍历列表
#----------------------------------------------------------
if(0):
    my_list = [100, 200, 300, 400, 500]
    for item in my_list:
        print("item:{}".format(item))

    for idx, item in enumerate(my_list):
        print("idx:{}, item:{}".format(idx, item))

#----------------------------------------------------------
# 列表内置的方法
#----------------------------------------------------------
# >>> list.append()
# 在列表末尾添加元素 
if(0):
    mylist = [1, 2, 3]
    print(mylist.append(400))   # None
    print(mylist)               # [1, 2, 3, 400]

# >>> list.extend()
# 用可迭代对象扩展列表 
# 可迭代对象包括列表，字典，元祖
if(0):
    my_list = [1, 2, 3, 4]
    print(my_list.extend([100, 200, 300]))  # None
    print(my_list)                          # [1, 2, 3, 4, 100, 200, 300]

# >>> list.insert(pos, data)
# 在指定位置插入元素 
# TODO: 指定的位置是该位置的下标+1， 所以list.insert(len(list), data) 等价于 list.append()
if(0):
    my_list = [1, 2, 3, 4]
    print(my_list.insert(1, 100))   # None
    print(my_list)                  # [1, 100, 2, 3, 4]

# >>> list.remove(x)
# 删除列表中第一个值为x的元素 
# 执行remove后不会返回值
if(0):
    my_list = [1, 2, 3, 2, 4]
    print(my_list.remove(2))    # None
    print(my_list)              # [1, 3, 2, 4]

# >>> list.pop(pos)
# 移除指定位置的元素 
# TODO: 不指定位置时， 移除末尾元素
# TODO: 位置pos=实际下标
if(0):
    my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    print(my_list.pop())    # 10
    print(my_list)          # [1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(my_list.pop(3))   # 4
    print(my_list)          # [1, 2, 3, 5, 6, 7, 8, 9]

# >>> list.clear()
# 清空列表 
# 相当于 del list[:]
if(0):
    my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    print(my_list.clear())  # None
    print(my_list)          # []

# >>> list.index(val)
# 返回值为val第一次在列表中出现的下标
if(0):
    my_list = [1, 2, 3, 4, 5, 6, 7, 4, 9, 10]
    print(my_list.index(4))         # 3
    # TODO: 这里5和9是list的切片， 但index()返回的是原list的下标，而非切片后列表的下标
    print(my_list.index(4, 5, 9))   # 7

# >>> list.count(x)
# 返回list中x出现的次数
if(0):
    my_list = [1, 2, 3, 4, 3, 6, 3, 4, 3, 3]
    print(my_list.count(3))     # 5

# >>> list.sort()
# 对列表中的元素排序
if(0):
    my_list = [1, 2, 9, 4, 7, 6, 10, 3, 8, 5]
    print(my_list.sort())   # None
    print(my_list)          # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    print()
    my_list = [{7:100}, {7:90}, {7:3}]
    my_list.sort(key=lambda x: x[7], reverse=True)
    print(my_list)  # [{7: 100}, {7: 90}, {7: 3}]

# >>> list.reverse()
# 反转列表中的元素
if(0):
    my_list = [1, 2, 9, 4, 7, 6, 10, 3, 8, 5]
    print(my_list.reverse())    # None
    print(my_list)              # [5, 8, 3, 10, 6, 7, 4, 9, 2, 1]

# >>> list.copy()
# 返回列表的浅拷贝
# 相当于 list[:]
if(0):
    my_list = [1, 2, 9, 4, 7, 6, 10, 3, 8, 5]
    my_list_copy = my_list.copy()
    print(my_list_copy)     # [1, 2, 9, 4, 7, 6, 10, 3, 8, 5]


# 总结
# -------------------------------------------------------------------
"""
共11个方法
增
list.append(val)
list.extend(list)
list.insert(pos, val)
删
list.pop(pos)   --> 返回弹出的元素
list.remove(val)
list.clear()
查
list.index(val) --> 返回值
list.count(val) --> 返回次数
其他操作
list.sort()
list.reverse()
list.copy()    --> 返回拷贝列表 
"""
